package 富婆梦.第一阶段.Java基础视频学习.线程的练习.作业6;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @ProjectName: java-learning
 * @Package: 富婆梦.第一阶段.线程的练习.作业6
 * @ClassName: SellTicket
 * @Author: hemengjin
 * @Description: 3个线程打印递减数字 启动3个线程打印递减数字，范围是：30~1。
 * 要求:数字不能重复，每个线程打印一个数字后，立刻进入睡眠状态，睡眠时间300毫秒。（模拟多线程售票）
 * 提示：
 * 1、定义一个类，其中定义一个数学类型的属性，用于记录要输出数字的上限（本题目中为30），
 * 2、定义一个方法，用于循环输出数字，循环条件为属性大于0。每次输出数字的时候让记录数字上限的属性自减1。
 * 3、注意，在循环输出的时候，使用try...finally代码块保证try中lock获取锁，finally中释放锁。
 * @Date:2021/11/7 11:14
 * @Version: 1.0
 */
public class SellTicket implements Runnable {
    int ticketCount = 100;
    Lock lock = new ReentrantLock();
    Object object = new Object();

    @Override
    public void run() {
        while (ticketCount > 0) {
            lock.lock();
            if (ticketCount > 0) {
                try {
                    ticketCount--;
                    System.out.println(Thread.currentThread().getName() + "抢到一张票，当前还剩 " + ticketCount + "张票");
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }
/*        while (ticketCount > 0) {
            synchronized (object) {
                if (ticketCount>0){
                    ticketCount--;
                    System.out.println(Thread.currentThread().getName() + "抢到一张票，当前还剩 " + ticketCount + "张票");
                    try {
                        Thread.sleep(10);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }*/
    }

    public static void main(String[] args) {
        SellTicket sellTicket = new SellTicket();
        Thread t1 = new Thread(sellTicket);
        Thread t2 = new Thread(sellTicket);
        Thread t3 = new Thread(sellTicket);
        t1.setName("线程1");
        t2.setName("线程2");
        t3.setName("线程3");
        t1.start();
        t2.start();
        t3.start();


    }
}
